# -*- coding: utf-8 -*-
import logging

import torch

from model import XModel

logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

class Predictor:
    def __init__(self,config,model:XModel,model_path:str):
        self.config = config
        self.model = model
        self.model.load_state_dict(torch.load(model_path))
        # print(self.model.state_dict())

    def predict(self, input_ids):
        y_result = self.model(torch.LongTensor(input_ids))
        return int(torch.argmax(y_result))

if __name__ == '__main__':
    from config import Config
    from loader import XFileLoader
    import pandas as pd

    loader = XFileLoader(Config) #需要load 字典功能
    xmodel = XModel(Config)
    xmodel.eval()

    predictor = Predictor(Config,xmodel,"model_out/epoch_10.pth")
    # input_ids = loader.encode_sentence("房屋档案项目名称：香江名城·国际房屋类型：三室二厅一厨二卫工程面积：125平方米“588套餐”造价：7.35万元套餐以外增项价格：3.65万元（包含：水电改造、包垭口、包窗套、石膏板吊顶等）工程总造价：11万元主材名单“588套餐”配送的材料包括：蒙娜丽莎地砖、东洋铭木地板、福乐阁7系墙面漆、三优实创木门、三优实创橱柜、现代铝天花、箭牌洁具等。实创装修套餐掀起惠民风暴3月份，实创装饰宣布家装挺进工厂化时代，标志着家装从个性化、定制化逐步提升到规模化、标准化阶段。本月，该装饰公司再次重拳出击，接连推出一系列惠民行动，让更多的普通消费者能更方便地享用到现代化的装修服务。谈及推出惠民活动的目的，实创装饰集团总经理孙威说，该企业的定位是服务大众的平民化装修，今年该企业倡导工厂化装修，在预算、材料、施工、管理、模式等方面做到有可执行的标准，可以复制，可以规模化生产。孙威进一步解析，家装套餐是经过大众实践的最准确的家装预算管理，也是最符合大众家装基本需求的，套餐装修采用的原料都是全球采购、品质有保障、工业化程度较高，年初，实创率先在业内新增PDA工程管理系统，做到工程质量层层把控，先进的后台服务处理可以在产品运输、物流方面整合资源、节约成本，也可以在施工监理、工人施工、售后维护方面合理统筹，减少人力浪费。此次惠民风暴将从本月初开始陆续推进，本周直省万元的优惠活动将正式亮相，墙漆全面升级为北欧原装进口福乐阁涂料，仅此一项，消费者就可节约5000元。实创负责人说，这仅仅是一个序幕，更精彩的活动将在随后制造一波又一波惊喜")
    # y_p = predictor.predict([input_ids])
    # print(y_p)

    statics = {"correct": 0, "wrong": 0}
    # evalData = loader.load_file_data()
    # for index, test_data in enumerate(evalData):
    # csv = pd.read_csv(Config["train_data_path"])
    csv = pd.read_csv("D:/dataset/新闻/tag_news.csv")
    for t in csv.values:
        # print(t[0])
        # print(t[1])
        input_ids = loader.encode_sentence(t[0])
        y_p = predictor.predict([input_ids])

        if int(y_p) == int(t[1]):
            statics["correct"] += 1
        else:
            statics["wrong"] += 1
            print(y_p, '==>', t[1], y_p == t[1])

    #     x_batch, y_batch = test_data[0]
    #     y_batch = y_batch.view(-1)  # 转成向量
    #     with torch.no_grad():
    #         y_batch_model = xmodel.forward(x_batch)
    #     for y_model, y in zip(y_batch_model, y_batch):
    #         y_p = torch.argmax(y_model)
    #         if int(y_p) == int(y):
    #             statics["correct"] += 1
    #         else:
    #             statics["wrong"] += 1
    #
    correct = statics["correct"]
    wrong = statics["wrong"]
    logger.info("预测集合条目总量：%d" % (correct + wrong))
    logger.info("预测正确条目：%d，预测错误条目：%d" % (correct, wrong))
    logger.info("预测准确率：%f" % (correct / (correct + wrong)))
    logger.info("--------------------")